package gdepot

import grails.transaction.Transactional

@Transactional
class OrderService {

    /*def serviceMethod() {

    }*/
    static transactional = true//把service的每一个方法都当成一个事务去处理

    def prepareCart(session){
        def cart=null
        if(session.cartId){
            cart =Cart.get(session.cartId)
            if(cart && cart.status == CartStatus.NEW)
                return cart
        }
//        if(session.userId){
        if(session.user){
//            def user=User.get(session.userId)
            def user = session.user
            cart=Cart.findByUserAndStatus(user,CartStatus.NEW)
            if(cart){
                session.cartId=cart.id
                return cart
            }else{
                cart=new Cart(user:user,status: CartStatus.NEW)
                if(cart.save()){
                    session.cartId=cart.id

                    return cart
                }
            }
        }
        return cart
    }


    //添加到购物车
    def addToCart(session,goodsId){
        def cart=prepareCart(session)//取出购物车
        if(cart){
            def goods=Goods.get(goodsId)
            if (goods){
                def lineItem=null
                //判断购物车是否包含此商品
                lineItem=LineItem.findByCartAndGoods(cart,goods)
                if (lineItem){
                    //如果包含，则数量加1
                    lineItem.itemNumber=lineItem.itemNumber+1
                }else {
                    //如果不包含，添加一条记录，新记录数量为1
                    lineItem=new LineItem(cart:cart,goods: goods,itemNumber: 1)
                }
                if(lineItem.save(flush: true)){
                    println "save success"
                }
                else{
                    println "save Failed"
                }
                return lineItem
            }
        }
    }
    def saveOrder(session,orders){
        def cart=prepareCart(session)
        if(cart){
            orders.cart=cart
            orders.user=cart.user
//            orders.orderDate=new Date()   //直接在初始化的时候赋值
            orders.price=cart.totalPrice()
            orders.status=OrderStatus.TOBEPAID
//            if(!orders.hasErrors() && orders.save()){
            if(!orders.hasErrors() ){
                if (orders.save()){
                    cart.status=CartStatus.ORDER
                    if (cart.save()){
                        session.cartId=null //由于此cart的状态发生了变化，所以需要清楚session中的cartId
                        return orders
                    }
                }

            }
        }
        throw new RuntimeException('Save order failed!')
    }


}
